/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.contexts;

import java.util.HashSet;
import java.util.Set;
import javax.naming.InitialContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.exceptions.InjectionException;
import pl.tewi.types.ApplicationServerType;

/**
 * Główna klasa injektora pobierajaca z serwera aplikacyjnego zasoby i 
 * wstrzykująca je w pola obiektu klasy testowej.
 * @author Marcin Kwapisz
 */
public class FrameworkFieldInjector implements FieldInjector {

    /**
     * Logger.
     */
    private static Logger LOGGER = LoggerFactory.getLogger(FrameworkFieldInjector.class);
    /**
     * Singleton.
     */
    private static FrameworkFieldInjector frameworkFieldInjector = null;
    /**
     * Zbiór różnych injektorów obsługujących wstrzyknięcia różnych zasobów w 
     * pola obiektu klasy testowej.
     */
    private Set<FieldInjector> injectors = new HashSet<FieldInjector>();

    public static FrameworkFieldInjector getFrameworkFieldInjector() {
        if (frameworkFieldInjector == null) {
            frameworkFieldInjector = new FrameworkFieldInjector();
        }
        return frameworkFieldInjector;
    }

    /**
     * Konstruuje komponenty wstrzykujace zależności do obiektów klas testowych.
     */
    private FrameworkFieldInjector() {
        injectors.add(new EjbFieldInjector());
    }

    /**
     * Wykonuje wstrzyknięcie zasobu dla każdej znanej adnotacji.
     * @param test obiekt dla którego mają być wykonane wstrzyknięcie
     * @param initialContext kontekst do przeszukiwania jndi serwera aplikacyjnego
     * @param applicationServerContext kontekst narzędzia dla serwera aplikacyjnego
     * @throws InjectionException błąd wstrzykiwania zależności w pole obiketu klasy testu
     */
    @Override
    public void inject(Object test, InitialContext initialContext, ApplicationServerContext applicationServerContext) throws InjectionException {
        if (applicationServerContext.getApplicationServerType().equals(ApplicationServerType.DUMMY)) {
            LOGGER.debug("Skipping injecting resources for a dummy server");
        } else {
            for (FieldInjector injector : injectors) {
                injector.inject(test, initialContext, applicationServerContext);
            }
        }
    }
}

